package com.example.file.controller;

import com.example.file.model.SysFile;
import com.example.file.response.Response;
import com.example.file.service.SysFileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;

import java.io.File;
import java.util.List;

@RestController
@RequestMapping("/file")
public class SysFileController {

    @Autowired
    private SysFileService sysFileService;

    /**
     * 1. new File("E:")
     * 当你使用 new File("E:") 时，File 对象并不直接代表 E 盘的根目录。在 Java 里，这种形式的路径表示的是相对路径，它是相对于当前工作目录的 E 盘路径。当前工作目录是 Java 程序启动时所在的目录。
     * <p>
     * 例如，如果当前工作目录是 C:\Users\YourUsername\Documents，那么 new File("E:") 实际上代表的是 E:\Users\YourUsername\Documents。如果这个路径不存在或者没有权限访问，listFiles() 方法会返回 null。
     * <p>
     * 2. new File("E:\\")
     * 使用 new File("E:\\") 时，这里的双反斜杠 \\ 是 Java 字符串中表示单个反斜杠的转义序列。所以这个 File 对象代表的是 E 盘的根目录，即 E:\。当调用 listFiles() 方法时，它会返回 E 盘根目录下的所有文件和文件夹的 File 对象数组。
     * 可以用getAbsolutePath方法来证明。
     *
     */
    @GetMapping("/listFiles")
    public Response<List<SysFile>> listFiles(@RequestParam(required = false) String path) {
        if (!StringUtils.hasText(path)) {
            path = null;
        }
        return Response.success(sysFileService.listFiles(path));
    }

    @GetMapping("/download")
    public ResponseEntity<Resource> downloadFile(@RequestParam String path, @RequestParam(required = false) Boolean handleFlag) {

        return sysFileService.downloadFile(path,handleFlag);

    }

    @PostMapping(value = "/uploadFile")
    public Mono<Response<?>> uploadFile(@RequestParam String path, @RequestPart("file") FilePart file) {
        return sysFileService.uploadFile(file, path);
    }

}
